Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


meshchatx/src/frontend/js/deviceBattery.js c0b0ddffd735a0d007c1be9a5e8563ec42fdafc0 (c0b0ddff) Text, 9.17 KB

T8b949e// SPDX-License-Identifier: 0BSD

T8b949e/**
* Host device battery probe for laptops and mobile shells.
*
* Order: Android bridge, then Electron IPC.
* The Chromium Battery Status API is opt-in only. Headless and Docker
* Chromium builds often report a fake "charging 100%" reading.
*/

Tff7b72import Te6edf3AndroidBridge Tff7b72from Ta5d6ff"./rnode/AndroidBridge.js"Tb4b4b4;
Tff7b72import Te6edf3ElectronUtils Tff7b72from Ta5d6ff"./ElectronUtils.js"Tb4b4b4;

T8b949e/**
* @typedef {object} DeviceBatteryStatus
* @property {boolean} supported
* @property {number|null} level Percent 0-100, or null when unknown
* @property {boolean|null} charging
* @property {"android"|"electron"|"web"|null} source
*/

T8b949e/**
* @param {unknown} value
* @param {{ unitFraction?: boolean }} [options]
* @returns {number|null}
*/
Tff7b72export Tff7b72function Te6edf3normalizeBatteryPercentTb4b4b4(Te6edf3valueTb4b4b4, Te6edf3options Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3value Tff7b72== Tff7b72null Tff7b72|| Te6edf3value Tff7b72=== Ta5d6ff""Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3n Tff7b72= Tff7b72typeof Te6edf3value Tff7b72=== Ta5d6ff"number" Tff7b72? Te6edf3value Tff7b72: Tffa657NumberTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3nTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3unitFraction Tff7b72= Tffa657BooleanTb4b4b4(Te6edf3optionsTb4b4b4.Te6edf3unitFractionTb4b4b4)Tb4b4b4;
Tff7b72let Te6edf3pctTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3unitFractionTb4b4b4) Tb4b4b4{
T8b949e// Chromium Battery Status API: 0.0-1.0
Te6edf3pct Tff7b72= Te6edf3n Tff7b72* T79c0ff100Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3n Tff7b72> T79c0ff0 Tff7b72&& Te6edf3n Tff7b72< T79c0ff1Tb4b4b4) Tb4b4b4{
T8b949e// Ambiguous float without an explicit scale: treat as a fraction.
Te6edf3pct Tff7b72= Te6edf3n Tff7b72* T79c0ff100Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// Native bridges report whole percents (including 0, 1, and 100).
Te6edf3pct Tff7b72= Te6edf3nTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3pct Tff7b72< T79c0ff0 Tff7b72|| Te6edf3pct Tff7b72> T79c0ff100Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Tffa657MathTb4b4b4.Te6edf3roundTb4b4b4(Te6edf3pctTb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* @param {unknown} raw
* @param {"android"|"electron"|"web"|null} source
* @returns {DeviceBatteryStatus|null}
*/
Tff7b72export Tff7b72function Te6edf3normalizeBatteryStatusTb4b4b4(Te6edf3rawTb4b4b4, Te6edf3source Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3raw Tff7b72== Tff7b72null Tff7b72|| Tff7b72typeof Te6edf3raw Tff7b72!== Ta5d6ff"object" Tff7b72|| Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3rawTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3resolvedSource Tff7b72= Te6edf3source Tff7b72|| Te6edf3rawTb4b4b4.Te6edf3source Tff7b72|| Tff7b72nullTb4b4b4;
Tff7b72const Te6edf3level Tff7b72= Te6edf3normalizeBatteryPercentTb4b4b4(Te6edf3rawTb4b4b4.Te6edf3level Tff7b72?? Te6edf3rawTb4b4b4.Te6edf3percent Tff7b72?? Te6edf3rawTb4b4b4.Te6edf3charge_percent Tff7b72?? Te6edf3rawTb4b4b4.Te6edf3capacityTb4b4b4, Tb4b4b4{
Te6edf3unitFractionTff7b72: Te6edf3resolvedSource Tff7b72=== Ta5d6ff"web"Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72let Te6edf3charging Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3rawTb4b4b4.Te6edf3charging Tff7b72=== Ta5d6ff"boolean"Tb4b4b4) Tb4b4b4{
Te6edf3charging Tff7b72= Te6edf3rawTb4b4b4.Te6edf3chargingTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3rawTb4b4b4.Te6edf3charging Tff7b72=== T79c0ff1 Tff7b72|| Te6edf3rawTb4b4b4.Te6edf3charging Tff7b72=== Ta5d6ff"1" Tff7b72|| Te6edf3rawTb4b4b4.Te6edf3charging Tff7b72=== Ta5d6ff"true"Tb4b4b4) Tb4b4b4{
Te6edf3charging Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3rawTb4b4b4.Te6edf3charging Tff7b72=== T79c0ff0 Tff7b72|| Te6edf3rawTb4b4b4.Te6edf3charging Tff7b72=== Ta5d6ff"0" Tff7b72|| Te6edf3rawTb4b4b4.Te6edf3charging Tff7b72=== Ta5d6ff"false"Tb4b4b4) Tb4b4b4{
Te6edf3charging Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3rawTb4b4b4.Te6edf3on_battery Tff7b72=== Ta5d6ff"boolean"Tb4b4b4) Tb4b4b4{
Te6edf3charging Tff7b72= Tff7b72!Te6edf3rawTb4b4b4.Te6edf3on_batteryTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3rawTb4b4b4.Te6edf3is_charging Tff7b72=== Ta5d6ff"boolean"Tb4b4b4) Tb4b4b4{
Te6edf3charging Tff7b72= Te6edf3rawTb4b4b4.Te6edf3is_chargingTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72== Tff7b72null Tff7b72&& Te6edf3charging Tff7b72== Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Tb4b4b4{
Te6edf3supportedTff7b72: Tff7b72trueTb4b4b4,
Te6edf3levelTb4b4b4,
Te6edf3chargingTb4b4b4,
Te6edf3sourceTff7b72: Te6edf3resolvedSourceTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}

T8b949e/**
* @param {string|object|null|undefined} payload
* @returns {DeviceBatteryStatus|null}
*/
Tff7b72export Tff7b72function Te6edf3parseAndroidBatteryPayloadTb4b4b4(Te6edf3payloadTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3payload Tff7b72== Tff7b72null Tff7b72|| Te6edf3payload Tff7b72=== Ta5d6ff""Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72let Te6edf3raw Tff7b72= Te6edf3payloadTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3payload Tff7b72=== Ta5d6ff"string"Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3raw Tff7b72= Tffa657JSONTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3normalizeBatteryStatusTb4b4b4(Te6edf3rawTb4b4b4, Ta5d6ff"android"Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* @returns {Promise<DeviceBatteryStatus|null>}
*/
Tff7b72async Tff7b72function Te6edf3probeAndroidBatteryTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3bridge Tff7b72= Tff7b72new Te6edf3AndroidBridgeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3bridgeTb4b4b4.Te6edf3isAvailableTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3payload Tff7b72= Te6edf3bridgeTb4b4b4.Te6edf3getBatteryStatusTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3parseAndroidBatteryPayloadTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* @returns {Promise<DeviceBatteryStatus|null>}
*/
Tff7b72async Tff7b72function Te6edf3probeElectronBatteryTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3ElectronUtilsTb4b4b4.Te6edf3isElectronTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3raw Tff7b72= Tff7b72await Te6edf3ElectronUtilsTb4b4b4.Te6edf3getBatteryStatusTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3normalizeBatteryStatusTb4b4b4(Te6edf3rawTb4b4b4, Ta5d6ff"electron"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* @returns {Promise<DeviceBatteryStatus|null>}
*/
Tff7b72async Tff7b72function Te6edf3probeWebBatteryTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3navigator Tff7b72=== Ta5d6ff"undefined" Tff7b72|| Tff7b72typeof Te6edf3navigatorTb4b4b4.Te6edf3getBattery Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3battery Tff7b72= Tff7b72await Te6edf3navigatorTb4b4b4.Te6edf3getBatteryTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3batteryTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3normalizeBatteryStatusTb4b4b4(
Tb4b4b4{
Te6edf3levelTff7b72: Te6edf3batteryTb4b4b4.Te6edf3levelTb4b4b4,
Te6edf3chargingTff7b72: Te6edf3batteryTb4b4b4.Te6edf3chargingTb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"web"
Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* Read host battery when a native shell exposes it.
*
* Web Battery Status is off by default (Docker / headless Chromium lies).
* Pass `{ allowWeb: true }` only when the caller accepts that risk.
*
* @param {{ allowWeb?: boolean }} [options]
* @returns {Promise<DeviceBatteryStatus|null>}
*/
Tff7b72export Tff7b72async Tff7b72function Te6edf3getDeviceBatteryStatusTb4b4b4(Te6edf3options Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3allowWeb Tff7b72= Tffa657BooleanTb4b4b4(Te6edf3optionsTb4b4b4.Te6edf3allowWebTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3androidStatus Tff7b72= Tff7b72await Te6edf3probeAndroidBatteryTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3androidStatusTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3androidStatusTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3electronStatus Tff7b72= Tff7b72await Te6edf3probeElectronBatteryTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3electronStatusTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3electronStatusTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3allowWebTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3probeWebBatteryTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}

T8b949e/**
* Material icon name for a battery reading.
*
* @param {DeviceBatteryStatus|null|undefined} status
* @returns {string}
*/
Tff7b72export Tff7b72function Te6edf3batteryStatusIconNameTb4b4b4(Te6edf3statusTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3status Tff7b72|| Tff7b72!Te6edf3statusTb4b4b4.Te6edf3supportedTb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"battery-unknown"Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3statusTb4b4b4.Te6edf3chargingTb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"battery-charging"Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3level Tff7b72= Te6edf3statusTb4b4b4.Te6edf3levelTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72== Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"battery"Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72<= T79c0ff15Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"battery-alert"Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72<= T79c0ff30Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"battery-low"Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72>= T79c0ff90Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"battery"Tb4b4b4;
Tb4b4b4}
Tff7b72return Ta5d6ff"battery-medium"Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Whether a reading came from a native host shell (not browser fakes).
*
* @param {DeviceBatteryStatus|null|undefined} status
* @returns {boolean}
*/
Tff7b72export Tff7b72function Te6edf3isNativeBatteryStatusTb4b4b4(Te6edf3statusTb4b4b4) Tb4b4b4{
Tff7b72return Tffa657BooleanTb4b4b4(Te6edf3status Tff7b72&& Te6edf3statusTb4b4b4.Te6edf3supported Tff7b72&& Tb4b4b4(Te6edf3statusTb4b4b4.Te6edf3source Tff7b72=== Ta5d6ff"android" Tff7b72|| Te6edf3statusTb4b4b4.Te6edf3source Tff7b72=== Ta5d6ff"electron"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Format a process create_time (unix seconds) as a short uptime label.
*
* @param {unknown} createTime
* @param {number} [nowMs]
* @returns {string|null}
*/
Tff7b72export Tff7b72function Te6edf3formatProcessUptimeTb4b4b4(Te6edf3createTimeTb4b4b4, Te6edf3nowMs Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3started Tff7b72= Tff7b72typeof Te6edf3createTime Tff7b72=== Ta5d6ff"number" Tff7b72? Te6edf3createTime Tff7b72: Tffa657NumberTb4b4b4(Te6edf3createTimeTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3startedTb4b4b4) Tff7b72|| Te6edf3started Tff7b72<= T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3seconds Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff0Tb4b4b4, Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3nowMs Tff7b72/ T79c0ff1000 Tff7b72- Te6edf3startedTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3days Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3seconds Tff7b72/ T79c0ff86400Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3hours Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tb4b4b4(Te6edf3seconds Tff7b72% T79c0ff86400Tb4b4b4) Tff7b72/ T79c0ff3600Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3minutes Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tb4b4b4(Te6edf3seconds Tff7b72% T79c0ff3600Tb4b4b4) Tff7b72/ T79c0ff60Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3secs Tff7b72= Te6edf3seconds Tff7b72% T79c0ff60Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3days Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff`Tffd700${Te6edf3daysTffd700}Ta5d6ffd Tffd700${Te6edf3hoursTffd700}Ta5d6ffhTa5d6ff`Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3hours Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff`Tffd700${Te6edf3hoursTffd700}Ta5d6ffh Tffd700${Te6edf3minutesTffd700}Ta5d6ffmTa5d6ff`Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3minutes Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff`Tffd700${Te6edf3minutesTffd700}Ta5d6ffm Tffd700${Te6edf3secsTffd700}Ta5d6ffsTa5d6ff`Tb4b4b4;
Tb4b4b4}
Tff7b72return Ta5d6ff`Tffd700${Te6edf3secsTffd700}Ta5d6ffsTa5d6ff`Tb4b4b4;
Tb4b4b4}

T8b949e/**
* @typedef {object} AppBatteryUsage
* @property {number|null} [estimated_percent_per_hour]
* @property {string|null} [intensity]
* @property {number|null} [machine_share_percent]
* @property {number|null} [avg_cpu_percent]
* @property {string|null} [confidence]
*/

T8b949e/**
* Primary label for estimated MeshChatX battery drain.
*
* @param {AppBatteryUsage|null|undefined} usage
* @param {(key: string, values?: object) => string} t
* @returns {string|null}
*/
Tff7b72export Tff7b72function Te6edf3formatAppBatteryUsageLabelTb4b4b4(Te6edf3usageTb4b4b4, Te6edf3tTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3usage Tff7b72|| Tff7b72typeof Te6edf3usage Tff7b72!== Ta5d6ff"object"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3usageTb4b4b4.Te6edf3confidence Tff7b72=== Ta5d6ff"warming_up" Tff7b72|| Te6edf3usageTb4b4b4.Te6edf3estimated_percent_per_hour Tff7b72== Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3tTb4b4b4(Ta5d6ff"about.app_battery_use_warming"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3rate Tff7b72= Tffa657NumberTb4b4b4(Te6edf3usageTb4b4b4.Te6edf3estimated_percent_per_hourTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3rateTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3rateText Tff7b72= Ta5d6ff`Tffd700${Te6edf3rateTb4b4b4.Te6edf3toFixedTb4b4b4(Te6edf3rate Tff7b72>= T79c0ff10 Tff7b72? T79c0ff0 Tff7b72: T79c0ff1Tb4b4b4)Tffd700}Ta5d6ff%/hrTa5d6ff`Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3usageTb4b4b4.Te6edf3intensityTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3tTb4b4b4(Ta5d6ff"about.app_battery_use_with_intensity"Tb4b4b4, Tb4b4b4{
Te6edf3rateTff7b72: Te6edf3rateTextTb4b4b4,
Te6edf3intensityTff7b72: Te6edf3tTb4b4b4(Ta5d6ff`Ta5d6ffabout.app_battery_intensity_Tffd700${Te6edf3usageTb4b4b4.Te6edf3intensityTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3tTb4b4b4(Ta5d6ff"about.app_battery_use_rate"Tb4b4b4, Tb4b4b4{ Te6edf3rateTff7b72: Te6edf3rateText Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Secondary label for MeshChatX share of device CPU capacity.
*
* @param {AppBatteryUsage|null|undefined} usage
* @param {(key: string, values?: object) => string} t
* @returns {string|null}
*/
Tff7b72export Tff7b72function Te6edf3formatAppBatteryShareLabelTb4b4b4(Te6edf3usageTb4b4b4, Te6edf3tTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3usage Tff7b72|| Tff7b72typeof Te6edf3usage Tff7b72!== Ta5d6ff"object"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3share Tff7b72= Tffa657NumberTb4b4b4(Te6edf3usageTb4b4b4.Te6edf3machine_share_percentTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3shareTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3tTb4b4b4(Ta5d6ff"about.app_battery_share_value"Tb4b4b4, Tb4b4b4{
Te6edf3percentTff7b72: Te6edf3shareTb4b4b4.Te6edf3toFixedTb4b4b4(Te6edf3share Tff7b72>= T79c0ff10 Tff7b72? T79c0ff0 Tff7b72: T79c0ff1Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Tone class for estimated drain intensity.
*
* @param {AppBatteryUsage|null|undefined} usage
* @returns {string}
*/
Tff7b72export Tff7b72function Te6edf3appBatteryUsageToneClassTb4b4b4(Te6edf3usageTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3intensity Tff7b72= Te6edf3usageTff7b72?Tb4b4b4.Te6edf3intensityTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3intensity Tff7b72=== Ta5d6ff"very_high" Tff7b72|| Te6edf3intensity Tff7b72=== Ta5d6ff"high"Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"text-amber-700 dark:text-amber-300"Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3intensity Tff7b72=== Ta5d6ff"moderate"Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"text-sky-700 dark:text-sky-300"Tb4b4b4;
Tb4b4b4}
Tff7b72return Ta5d6ff""Tb4b4b4;
Tb4b4b4}


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────